package network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {

    private Socket clientSocket = null;

    public TcpEchoClient(String serverIp, int serverPort) throws IOException {
        // 在创建 Socket 的同时, 和服务器 "建立连接", 同时告诉服务器的具体位置信息
        // new Socket对象时，操作系统内核进行“3次握手”，随机完成建立连接的过程
        clientSocket = new Socket(serverIp, serverPort);
    }

    public void start() throws IOException {
        System.out.println("客户端启动 !");
        try(InputStream is = clientSocket.getInputStream()) {
            try(OutputStream os = clientSocket.getOutputStream()) {
                Scanner scanner = new Scanner(System.in);
                // 使用PrintWriter 对 outputStream 进行包裹, 将请求 转换成 字节流
                PrintWriter printWriter = new PrintWriter(os);
                // 使用Scanner 对 inputStream 进行包裹，将字节流响应 转换成 字符串
                Scanner inputScanner = new Scanner(is);
                while(true) {
                    // 1. 构造请求内容
                    System.out.print("->");
                    String request = scanner.next();
                    // 2. 将字符串作为请求，发送给服务器
                    // 此处使用带 换行 的println是为了服务器读取请求时，使用 scanner.next 读取每条数据
                    printWriter.println(request);
                    // 刷新内存， 防止写入 OutputStream 的数据 滞留在内存中
                    printWriter.flush();
                    // 3. 读取服务器发回的响应
                    // 此处使用 scanner.next 与服务器发回的带"\n"的响应相呼应
                    String response = inputScanner.next();
                    // 4. 打印响应信息
                    System.out.println(response);
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws IOException {
        TcpEchoClient client = new TcpEchoClient("127.0.0.1", 8080);
        client.start();
    }
}
